package org.xml.parser.SAX;

import java.util.ArrayList;

import org.xml.Book;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * 创建一个类继承自DefaultHandler，重写其中的一些方法用来进行业务处理
 *
 */
public class SAXParserHandler extends DefaultHandler {
	private String value = null;// 全局变量保存节点中的内容
	private Book book = null;
	private ArrayList<Book> bookList = new ArrayList<Book>();

	public ArrayList<Book> getBookList() {
		return bookList;
	}

	/**
	 * 解析XML文件的开始标签，uri-名称空间，localName-名称空间的标签，如果没有名称空间，则为空
	 * qName-标签名，attributes-属性集合
	 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);
		if ("book".equals(qName)) {
			book = new Book();// 每遇到book的一个开始标记就创建一个Book对象
			String idAttr = attributes.getValue("id");
			book.setId(idAttr);// 为book对象设置id属性
		}
	}

	/**
	 * 字符数组ch-元素中的内容，start-开始位置，length-长度
	 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		super.characters(ch, start, length);
		value = new String(ch, start, length);
	}

	/**
	 * 解析XML文件的结束标签
	 */
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		super.endElement(uri, localName, qName);
		if ("book".equals(qName)) {
			bookList.add(book);// book中的属性被设置新的值之前将其加入ArrayList中
		} else if ("name".equals(qName)) {// 遇到结束标记表明元素节点中的内容已经全部取得
			book.setName(value);
		} else if ("author".equals(qName)) {
			book.setAuthor(value);
		} else if ("year".equals(qName)) {
			book.setYear(value);
		} else if ("price".equals(qName)) {
			book.setPrice(value);
		} else if ("language".equals(qName)) {
			book.setLanguage(value);
		}
	}
}
